/**
 * FileName: ClientHandler
 * Author: Mr.Wang
 * Date: 2025/10/15 15:10
 * Description:
 * History:
 */
package org.test.device.config.netty;

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

/**
 * 〈一句话功能简述〉<br>
 * 〈通道处理器，定义了处理 IO 事件的逻辑〉
 *
 * @author Mr.Wang
 * @create 2025/10/15
 * @since 1.0.0
 */
@Slf4j
@Component
@Scope("prototype")
public class ClientHandler extends ChannelInboundHandlerAdapter {

    @Autowired
    private NettyCallbackCenter callbackCenter;

    // 心跳消息标识（与服务端保持一致）
    private static final String HEARTBEAT_MSG = "HEARTBEAT";
    // 心跳响应标识（与服务端保持一致）
    private static final String PONG_MSG = "PONG";

    // JSON解析器（用于解析服务端响应中的messageId）
    private static final ObjectMapper objectMapper = new ObjectMapper();

    /**
     * 连接成功时调用
     */
    @Override
    public void channelActive(ChannelHandlerContext ctx) throws Exception {
        log.info("[NettyClient]已连接到服务器:{}", ctx.channel().remoteAddress());
    }

    /**
     * 连接关闭时调用
     */
    @Override
    public void channelRead(ChannelHandlerContext ctx,Object msg) throws Exception {
        String clientMsg = (String) msg;
        log.info("[ClientHandler]收到服务端响应：{}", clientMsg);
        // 1. 优先过滤心跳消息（核心修改）
        if (HEARTBEAT_MSG.equals(clientMsg)) {
            log.debug("[ClientHandler]收到服务端心跳，无需处理");
            return;
        }
        // 2. 过滤心跳响应消息（如果服务端也会回复PONG）
        if (PONG_MSG.equals(clientMsg)) {
            log.debug("[ClientHandler]收到心跳响应，无需处理");
            return;
        }
        String messageId = "UNKNOWN";
        try {
            // 解析服务端响应中的messageId（必须包含，否则无法回调）
            JsonNode jsonNode = objectMapper.readTree(clientMsg);
            if (!jsonNode.has("messageId")) {
                log.error("[ClientHandler]服务端响应缺少messageId字段，无法触发回调");
                return;
            }
            messageId = jsonNode.get("messageId").asText();

            // 调用注入的回调中心，触发成功回调（不再依赖单例）
            callbackCenter.triggerSuccess(messageId, clientMsg);
        } catch (Exception e) {
            log.error("[ClientHandler]处理服务端响应异常", e);
        }
    }

    /**
     * 处理异常时调用
     */
    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
        log.error("[NettyClient]客户端发生异常", cause);
        ctx.close();
    }
}